<!-- 回到顶部的按钮 -->
<template>
  <image v-if="mOption.src" class="mescroll-totop"
    :class="[value ? 'mescroll-totop-in' : 'mescroll-totop-out', {'mescroll-totop-safearea': mOption.safearea}]"
    :style="{'z-index':mOption.zIndex, 'left': left, 'right': right, 'bottom':addUnit(mOption.bottom), 'width':addUnit(mOption.width), 'border-radius':addUnit(mOption.radius)}"
    :src="mOption.src" mode="widthFix" @click="toTopClick" />
</template>

<script>
  export default {
    props: {
      // up.toTop的配置项
      option: Object,
      // 是否显示
      value: false
    },
    computed: {
      // 支付宝小程序需写成计算属性,prop定义default仍报错
      mOption() {
        return this.option || {}
      },
      // 优先显示左边
      left() {
        return this.mOption.left ? this.addUnit(this.mOption.left) : 'auto';
      },
      // 右边距离 (优先显示左边)
      right() {
        return this.mOption.left ? 'auto' : this.addUnit(this.mOption.right);
      }
    },
    methods: {
      addUnit(num) {
        if (!num) return 0;
        if (typeof num === 'number') return num + 'rpx';
        return num
      },
      toTopClick() {
        this.$emit('input', false); // 使v-model生效
        this.$emit('click'); // 派发点击事件
      }
    }
  };
</script>

<style>
  /* 回到顶部的按钮 */
  .mescroll-totop {
    z-index: 9990;
    position: fixed !important;
    /* 加上important避免编译到H5,在多mescroll中定位失效 */
    right: 20rpx;
    bottom: 120rpx;
    width: 72rpx;
    height: auto;
    border-radius: 50%;
    opacity: 0;
    transition: opacity 0.5s;
    /* 过渡 */
    margin-bottom: var(--window-bottom);
    /* css变量 */
  }

  /* 适配 iPhoneX */
  @supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
    .mescroll-totop-safearea {
      margin-bottom: calc(var(--window-bottom) + constant(safe-area-inset-bottom));
      /* window-bottom + 适配 iPhoneX */
      margin-bottom: calc(var(--window-bottom) + env(safe-area-inset-bottom));
    }
  }

  /* 显示 -- 淡入 */
  .mescroll-totop-in {
    opacity: 1;
  }

  /* 隐藏 -- 淡出且不接收事件*/
  .mescroll-totop-out {
    opacity: 0;
    pointer-events: none;
  }
</style>
